package main

import "fmt"

/*
顺时针打印矩阵
输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1：
输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出：[1,2,3,6,9,8,7,4,5]

示例 2：
输入：matrix =[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出：[1,2,3,4,8,12,11,10,9,5,6,7]
*/

func spiralOrder(matrix [][]int) []int {
	if len(matrix) == 0 {
		return nil
	}
	var res []int
	top, bottom, left, right := 0, len(matrix)-1, 0, len(matrix[0])-1 //初始上下左右边界条件
	for bottom >= top && right >= left {                              //循环条件：下大于上 右大于左
		for i := left; i <= right; i++ { //top行从左往右遍历
			res = append(res, matrix[top][i])
		}
		top++                            //top行遍历完了 top往下移动
		for i := top; i <= bottom; i++ { //right列从上往下遍历
			res = append(res, matrix[i][right])
		}
		right--                           //right行遍历完了 right往左移动
		if left > right || top > bottom { //这里一定要做一个判断，因为如果只剩下一个元素就会出错
			break
		}
		for i := right; i >= left; i-- { //bottom行 从右往左遍历
			res = append(res, matrix[bottom][i])
		}
		bottom--
		for i := bottom; i >= top; i-- { //left列 从下往上遍历
			res = append(res, matrix[i][left])
		}
		left++
	}
	return res
}

func main() {
	matrix := [][]int{
		{1, 2, 3},
		{4, 5, 6},
		{7, 8, 9},
	}
	fmt.Println(spiralOrder(matrix))
}
